﻿<div class="tab-pane fade" id="nav-paycallback" role="tabpanel" aria-labelledby="nav-profile-tab">
    <h5>支付回调</h5>
    <p>
        当用户在微信端完成支付后，微信服务器会主动推送一条通知到应用服务器。这条信息只会在微信官方服务器和应用服务器之间发生，不会有用户的参与，并且附加签名校验，因此才是可信的。
        <blockquote class="blockquote">
            <p><strong>注意：千万不能信任手机客户端完成支付的状态，并以此通知应用服务器用户已完成支付！</strong></p>
        </blockquote>

    <p>以 JsApi 支付为例，当发起统一支付时，会要求填写回调地址（<code>TenPayV3UnifiedorderRequestData</code> 中的 <code>notifyUrl</code> 参数，见 <strong>JSAPI 支付</strong> 相关说明）。</p>
    <blockquote class="blockquote">
        <p>注意：不同的支付方式提供回调地址的设置可能不同，如“Native 支付”，则是在微信支付的管理后台设置。</p>
    </blockquote>

    <h5>定义回调入口</h5>
    <pre><code>/// &lt;summary&gt;
/// JS-SDK支付回调地址（在下单接口中设置的 notify_url）
/// &lt;/summary&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public async Task&lt;IActionResult&gt; PayNotifyUrl()
{
    try
    {
        //获取微信服务器异步发送的支付通知信息
        var resHandler = new TenPayNotifyHandler(HttpContext);
        var orderReturnJson = await resHandler.AesGcmDecryptGetObjectAsync&lt;OrderReturnJson&gt;();

        //获取支付状态
        string trade_state = orderReturnJson.trade_state;

        //验证请求是否从微信发过来（安全）
        NotifyReturnData returnData = new();

        //验证可靠的支付状态
        if (orderReturnJson.VerifySignSuccess == true &amp;&amp; trade_state == &quot;SUCCESS&quot;)
        {
            returnData.code = &quot;SUCCESS&quot;;//正确的订单处理
            /* 提示：
             * 1、直到这里，才能认为交易真正成功了，可以进行数据库操作，但是别忘了返回规定格式的消息！
             * 2、上述判断已经具有比较高的安全性以外，还可以对访问 IP 进行判断进一步加强安全性。
             * 3、下面演示的是发送支付成功的模板消息提示，非必须。
             */
        }
        else
        {
            returnData.code = &quot;FAILD&quot;;//错误的订单处理
            returnData.message = &quot;验证失败&quot;;

            //此处可以给用户发送支付失败提示等
        }

        return Json(returnData);
    }
    catch (Exception ex)
    {
        WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex));
        throw;
    }
}</code></pre>

    <figure class="file">
        <blockquote class="blockquote">
            <p>本项目参考文件：</p>
        </blockquote>
        <figcaption class="blockquote-footer">
            /<cite title="Source Title">Controllers/TenPayApiV3Controller.cs</cite>
        </figcaption>
    </figure>

</div>